Skip to content

XML 错误码说明 - XMLError

XML 模块多数接口通过 err 输出参数 返回 XMLError 枚举值(整数);部分写操作接口的 返回值 也为错误码。调用方应始终检查错误码,再使用返回值或句柄。

模块总览见 XML 模块总览


枚举定义

c
// XML 操作错误码枚举
typedef enum {
    XML_SUCCESS = 0,                // 操作成功
    XML_ERROR_INVALID_HANDLE,       // 无效的句柄
    XML_ERROR_PARSE_FAILED,         // XML 解析失败
    XML_ERROR_TYPE_MISMATCH,        // 类型不匹配
    XML_ERROR_ELEMENT_NOT_FOUND,    // 元素不存在
    XML_ERROR_ATTRIBUTE_NOT_FOUND,  // 属性不存在
    XML_ERROR_UNKNOWN               // 未知错误
} XMLError;

未显式赋值的枚举成员从 0 起依次递增,对应整型值如下:

常量说明
XML_SUCCESS0操作成功
XML_ERROR_INVALID_HANDLE1无效的句柄
XML_ERROR_PARSE_FAILED2XML 解析失败
XML_ERROR_TYPE_MISMATCH3类型不匹配
XML_ERROR_ELEMENT_NOT_FOUND4元素不存在
XML_ERROR_ATTRIBUTE_NOT_FOUND5属性不存在
XML_ERROR_UNKNOWN6未知错误

各错误码详解

XML_SUCCESS(0)

操作正常完成。此时:

  • err 输出参数 的接口:err == 0,返回值(句柄、字符串指针、数值等)可按文档说明使用。
  • 直接返回 int32_t 的写操作(如 XmlSetAttribute):返回 0 表示成功。

XML_ERROR_INVALID_HANDLE(1)

传入的 文档或元素句柄无效,常见原因:

场景示例
句柄为 0未初始化、查找失败结果被当作有效句柄
句柄已释放调用 XmlFree 后仍操作文档或其子元素
句柄来源错误将元素句柄当作文档句柄传入 XmlGetRootElement
子句柄失效父文档释放后,其下元素句柄均不可用

处理建议:确认句柄来自 XmlParseXmlParseFileXmlCreateDocument 或遍历/查找接口的成功结果,且在 XmlFree 之前使用。

XML_ERROR_PARSE_FAILED(2)

XmlParseXmlParseFile 无法将输入解析为合法 XML。

常见原因:标签未闭合、非法字符、文件不存在或读取失败、非 XML 文本。

此时文档句柄为 0err2。勿对失败句柄调用其他 XML 接口。

XML_ERROR_TYPE_MISMATCH(3)

当前操作与节点 实际类型或结构不符

接口典型触发条件
XmlGetAttributeInt / XmlGetAttributeDouble属性值无法转换为目标类型
XmlAppendChild父节点不允许挂载该子节点类型
XmlGetRootElement传入句柄不是文档句柄
强类型属性读写属性存在但格式与请求类型不匹配

XML_ERROR_ELEMENT_NOT_FOUND(4)

找不到指定 元素

常见于 XmlFindElementXmlFindElementByAttributeXmlQueryElementXmlGetChildByNameAndIndexXmlRemoveChild 等。也包括遍历轴上 无对应兄弟/子节点 时(如 XmlGetFirstChild 对叶节点返回失败)。

元素名 区分大小写

XML_ERROR_ATTRIBUTE_NOT_FOUND(5)

元素上找不到指定 属性名

常见于 XmlGetAttributeXmlGetAttributeIntXmlDeleteAttributeXmlHasAttribute(配合 err 区分「无属性」与「句柄错误」)等。

XML_ERROR_UNKNOWN(6)

未归类的内部错误。若频繁出现,请检查输入数据、句柄生命周期,并向插件维护方反馈复现步骤。


错误码的传递方式

XML 接口以 err 输出参数 为主,写操作常同时通过 返回值 反映结果:

类型代表接口如何判断成功
err 输出参数XmlParseXmlGetRootElementXmlFindElementXmlGetAttributeXmlToString 等绝大多数接口err == 0XML_SUCCESS
返回值即错误码XmlSetAttributeXmlSetElementTextXmlAppendChildXmlRemoveChildXmlDeleteAttribute 等写操作返回 0 表示成功;非 0 为错误码(同时建议检查 err
返回值表业务结果XmlCompareElements1 相同 / 0 不同)、XmlValidate1 有效 / 0 无效)、XmlHasChildren / XmlHasAttribute以返回值含义为准;接口级错误(如无效句柄)通过 err 返回
err 参数XmlCreateDocumentXmlFreeXmlGetObjectCountXmlCleanupAll按各接口返回值表判断;失败时无 XMLError 明细

err 可传 NULL 表示不关心错误详情,但 不建议 在生产代码中忽略。


示例

解析与查找

cpp
int32_t err = 0;
int64_t doc = ola.XmlParse(xmlStr, &err);
if (doc == 0 || err != 0) {
    // err == XML_ERROR_PARSE_FAILED (2) 等
    return;
}

int32_t findErr = 0;
int64_t user = ola.XmlFindElement(root, "user", &findErr);
if (findErr == XML_ERROR_ELEMENT_NOT_FOUND) {
    // 未找到 <user> 元素
}

ola.XmlFree(doc);

读取属性

cpp
int32_t err = 0;
const char* level = ola.XmlGetAttribute(element, "level", &err);
if (err == XML_ERROR_ATTRIBUTE_NOT_FOUND) {
    // 属性 level 不存在
} else if (err != 0) {
    // 其他错误
}

写操作

cpp
int32_t err = 0;
int32_t rc = ola.XmlSetAttribute(element, "id", "1", &err);
if (rc != XML_SUCCESS || err != 0) {
    // rc 或 err 非 0
}

与返回值的关系

部分接口在失败时返回 哨兵值,须结合 err 判断:

接口失败时的返回值须同时检查
XmlParse / XmlParseFile0err != 0
XmlFindElement 等查找类0err != 0(未找到时 err 常为 XML_ERROR_ELEMENT_NOT_FOUND
XmlGetAttribute / XmlGetElementText / XmlToStringNULLerr != 0
XmlGetAttributeDouble0.0err != 0
XmlGetElementDepth-1err != 0
XmlGetFirstChild 等遍历轴0err != 0(无子节点/兄弟时可能为 XML_ERROR_ELEMENT_NOT_FOUND